package admin

import (
	models "HeadLineNews/proto_models/manage/admin_model"
	"HeadLineNews/resp"
	"github.com/gin-gonic/gin"
)

// Server 实现哪些业务功能
type Server interface {
	RegisterHandler(c *gin.Context)
	LoginHandler(c *gin.Context)
	ListAdminHandler(c *gin.Context)
}

type service struct {
	ctx   Ctx   // 上下文参数解析
	repo  Repo  // 交互数据库
	cache Cache // 交互 redis
}

func NewServer() Server {
	return &service{
		ctx:   NewCtx(),
		repo:  NewRepo(),
		cache: NewCache(),
	}
}

// RegisterHandler 管理员账号注册
func (s *service) RegisterHandler(c *gin.Context) {
	// 1. 解析注册参数
	p, err := s.ctx.ParseParamAdminRegister(c)
	if err != nil {
		return
	}
	// 2. 检查唯一用户名
	if err = s.repo.CheckUniqueAdminName(c, p.AdminName); err != nil {
		return
	}
	// 3. 录入注册参数 + 签发token
	var adminId, token string
	if adminId, token, err = s.repo.InsertAdminUser(c, p); err != nil {
		return
	}
	resp.Success(c, &models.ResponseAdminLoginRegister{
		AdminId:       adminId,
		AdminName:     p.AdminName,
		Authorization: token,
	})
}

// LoginHandler 管理员登录
func (s *service) LoginHandler(c *gin.Context) {
	// 1. 解析登录参数
	p, err := s.ctx.ParseParamAdminLogin(c)
	if err != nil {
		return
	}
	// 2. 检查用户名密码
	var np *models.ResponseAdminLoginRegister
	if np, err = s.repo.CheckLoginData(c, p); err != nil {
		return
	}
	// 3. 签发 token
	var token string
	if token, err = s.cache.RegAdminLoginToken(np.AdminId, np.GroupIds...); err != nil {
		return
	}
	// 4. 返回响应
	resp.Success(c, &models.ResponseAdminLoginRegister{
		AdminId:       p.AdminId,
		AdminName:     p.AdminName,
		Authorization: token,
	})
}

// ListAdminHandler 展示管理员
func (s *service) ListAdminHandler(c *gin.Context) {
	// 1. 解析请求参数
	p, err := s.ctx.ParseParamListAdmin(c)
	if err != nil {
		return
	}
	var data *models.ResponseListAdmin
	if data, err = s.repo.ListAdmin(c, p); err != nil {
		return
	}

	resp.Success(c, data)
}
